home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Griffith 0.9.8 / griffith-0.9.8-win32.exe / {app} / lib / main_treeview.py < prev    next >
Text File  |  2008-11-17  |  20KB  |  513 lines

  1. # -*- coding: UTF-8 -*-
  2.  
  3. __revision__ = '$Id: main_treeview.py 1040 2008-11-15 21:13:49Z mikej06 $'
  4.  
  5. # Copyright (c) 2005-2008 Vasco Nunes, Piotr O┼╝arowski
  6.  
  7. # This program is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation; either version 2 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. # GNU Library General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program; if not, write to the Free Software
  19. # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  20.  
  21. # You may use and distribute this software under the terms of the
  22. # GNU General Public License, version 2 or later
  23.  
  24. import gutils
  25. import os
  26. import gtk
  27.  
  28. def treeview_clicked(self):
  29.     if self.initialized is False:
  30.         return False
  31.     if self.total:
  32.         treeselection = self.widgets['treeview'].get_selection()
  33.         (tmp_model, tmp_iter) = treeselection.get_selected()
  34.         if tmp_iter is None:
  35.             self.debug.show('Treeview: no selection')
  36.             return False
  37.         number = tmp_model.get_value(tmp_iter,0)
  38.         movie = self.db.Movie.get_by(number=number)
  39.         movie.refresh() # loan data can be obsolete in cache
  40.         if movie is None:
  41.             self.debug.show("Treeview: movie doesn't exists (number=%s)"%number)
  42.         set_details(self, movie)
  43.     else:
  44.         set_details(self, {})
  45.  
  46. def set_details(self, item=None):#{{{
  47.     from loan import get_loan_info, get_loan_history
  48.     if item is None:
  49.         item = {}
  50.     if item.has_key('movie_id') and item['movie_id']:
  51.         self._movie_id = item['movie_id']
  52.     else:
  53.         self._movie_id = None
  54.     w = self.widgets['movie']
  55.  
  56.     if item.has_key('number') and item['number']:
  57.         w['number'].set_text(str(int(item['number'])))
  58.     else:
  59.         w['number'].set_text('')
  60.     if item.has_key('title') and item['title']:
  61.         w['title'].set_markup("<b><span size='large'>%s</span></b>" % gutils.html_encode(item['title']))
  62.     else:
  63.         w['title'].set_text('')
  64.     if item.has_key('o_title') and item['o_title']:
  65.         w['o_title'].set_markup("<span size='medium'><i>%s</i></span>" % gutils.html_encode(item['o_title']))
  66.     else:
  67.         w['o_title'].set_text('')
  68.     if item.has_key('director') and item['director']:
  69.         w['director'].set_markup("<i>%s</i>" % gutils.html_encode(item['director']))
  70.     else:
  71.         w['director'].set_text('')
  72.     if item.has_key('plot') and item['plot']:
  73.         w['plot'].set_text(str(item['plot']))
  74.     else:
  75.         w['plot'].set_text('')
  76.     if item.has_key('year') and item['year']:
  77.         w['year'].set_text(str(item['year']))
  78.     else:
  79.         w['year'].set_text('')
  80.     if item.has_key('runtime') and item['runtime']:
  81.         w['runtime'].set_text(str(int(item['runtime'])))
  82.     else:
  83.         w['runtime'].set_text('x')
  84.     if item.has_key('cast') and item['cast']:
  85.         w['cast'].set_text(str(item['cast']))
  86.     else:
  87.         w['cast'].set_text('')
  88.     if item.has_key('country') and item['country']:
  89.         w['country'].set_markup("<i>%s</i>" % gutils.html_encode(item['country']))
  90.     else:
  91.         w['country'].set_text('')
  92.     if item.has_key('genre') and item['genre']:
  93.         w['genre'].set_markup("<i>%s</i>" % gutils.html_encode(item['genre']))
  94.     else:
  95.         w['genre'].set_text('')
  96.     if item.has_key('cond') and item['cond']:
  97.         if str(item['cond']) in [ str(i) for i in range(len(self._conditions)) ]:
  98.             w['condition'].set_markup("<i>%s</i>" % self._conditions[item['cond']])
  99.         else:
  100.             w['condition'].set_text('')
  101.             self.debug.show("Wrong value in 'condition' field (movie_id=%s, cond=%s)" % (item['movie_id'], item['cond']))
  102.     else:
  103.         w['condition'].set_text('')
  104.     if item.has_key('region') and item['region']:
  105.         if str(item['region']) in [ str(i) for i in range(len(self._regions)) ]:
  106.             w['region'].set_markup("<i>%s</i>" % gutils.html_encode(item['region']))
  107.             if int(item['region']) < 9:
  108.                 self.widgets['tooltips'].set_tip(w['region'], self._regions[int(item['region'])])
  109.         else:
  110.             self.debug.show("Wrong value in 'region' field (movie_id=%s, region=%s)" % (item['movie_id'], item['region']))
  111.             w['region'].set_text('')
  112.             self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A
  113.     else:
  114.         w['region'].set_text('')
  115.         self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A
  116.     if item.has_key('layers') and item['layers']:
  117.         if str(item['layers']) in [ str(i) for i in range(len(self._layers)) ]:
  118.             w['layers'].set_markup("<i>%s</i>" % self._layers[item['layers']])
  119.         else:
  120.             self.debug.show("Wrong value in 'layers' field (movie_id=%s, layers=%s)" % (item['movie_id'], item['layers']))
  121.             w['layers'].set_text('')
  122.     else:
  123.         w['layers'].set_text('')
  124.     if item.has_key('color') and item['color']:
  125.         if str(item['color']) in [ str(i) for i in range(len(self._colors)) ]:
  126.             w['color'].set_markup("<i>%s</i>" % self._colors[item['color']])
  127.         else:
  128.             self.debug.show("Wrong value in 'color' field (movie_id=%s, color=%s)" % (item['movie_id'], item['color']))
  129.             w['color'].set_markup('')
  130.     else:
  131.         w['color'].set_markup('')
  132.     if item.has_key('classification') and item['classification']:
  133.         w['classification'].set_markup("<i>%s</i>" % gutils.html_encode(item['classification']))
  134.     else:
  135.         w['classification'].set_text('')
  136.     if item.has_key('studio') and item['studio']:
  137.         w['studio'].set_markup("<i>%s</i>" % gutils.html_encode(item['studio']))
  138.     else:
  139.         w['studio'].set_text('')
  140.     if item.has_key('o_site') and item['o_site']:
  141.         self._o_site_url = str(item['o_site'])
  142.         w['go_o_site_button'].set_sensitive(True)
  143.     else:
  144.         self._o_site_url = None
  145.         w['go_o_site_button'].set_sensitive(False)
  146.     if item.has_key('site') and item['site']:
  147.         self._site_url = str(item['site'])
  148.         w['go_site_button'].set_sensitive(True)
  149.     else:
  150.         self._site_url = None
  151.         w['go_site_button'].set_sensitive(False)
  152.     if item.has_key('trailer') and item['trailer']:
  153.         self._trailer_url = str(item.trailer)
  154.         w['go_trailer_button'].set_sensitive(True)
  155.     else:
  156.         self._trailer_url = None
  157.         w['go_trailer_button'].set_sensitive(False)
  158.     if item.has_key('seen') and item['seen'] == True:
  159.         w['seen_icon'].set_from_file(os.path.join(self.locations['images'], 'seen.png'))
  160.     else:
  161.         w['seen_icon'].set_from_file(os.path.join(self.locations['images'], 'unseen.png'))
  162.     if item.has_key('notes') and item['notes']:
  163.         w['notes'].set_text(str(item.notes))
  164.     else:
  165.         w['notes'].set_text('')
  166.     tmp = ''
  167.     if item.has_key('media_num') and item['media_num']:
  168.         tmp = str(item.media_num)
  169.     else:
  170.         tmp = '0'
  171.     if item.has_key('medium_id') and item['medium_id']:
  172.         if item.medium is not None:
  173.             tmp += ' x ' + item.medium.name
  174.         else:
  175.             pass
  176.     w['medium'].set_markup("<i>%s</i>" % gutils.html_encode(tmp))
  177.     if item.has_key('vcodec_id'):
  178.         if item.vcodec is not None:
  179.             w['vcodec'].set_markup("<i>%s</i>" % gutils.html_encode(item.vcodec.name))
  180.         else:
  181.             w['vcodec'].set_text('')
  182.     else:
  183.         w['vcodec'].set_text('')
  184.  
  185.     # poster
  186.     if item.has_key('image') and item['image']:
  187.         tmp_dest = self.locations['posters']
  188.         tmp_img = os.path.join(tmp_dest, "m_%s.jpg"%item['image'])
  189.         tmp_img2 = os.path.join(tmp_dest, "%s.jpg"%item['image'])
  190.         if os.path.isfile(tmp_img2):
  191.             image_path = tmp_img
  192.             self.widgets['add']['delete_poster'].set_sensitive(True)
  193.             self.widgets['menu']['delete_poster'].set_sensitive(True)
  194.             w['picture_button'].set_sensitive(True)
  195.         else:
  196.             image_path = os.path.join(self.locations['images'], 'default.png')
  197.             self.widgets['add']['delete_poster'].set_sensitive(False)
  198.             self.widgets['menu']['delete_poster'].set_sensitive(False)
  199.             w['picture_button'].set_sensitive(False)
  200.         # lets see if we have a scaled down medium image already created
  201.         if not os.path.isfile(image_path):
  202.             # if not, lets make one for future use :D
  203.             original_image = os.path.join(tmp_dest, "%s.jpg"%item.image)
  204.             if os.path.isfile(original_image):
  205.                 gutils.make_medium_image(self, "%s.jpg"%item.image)
  206.     else:
  207.         image_path = os.path.join(self.locations['images'], 'default.png')
  208.         w['picture_button'].set_sensitive(False)
  209.     w['picture'].set_from_file(image_path)
  210.     # ratig
  211.     rimage = int(self.config.get('rating_image', 0))
  212.     if rimage:
  213.         prefix = ''
  214.     else:
  215.         prefix = 'meter'
  216.     if item.has_key('rating') and item['rating']:
  217.         rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, item['rating'])
  218.     else:
  219.         rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, 0)
  220.     handler = w['image_rating'].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(rating_file))
  221.     gutils.garbage(handler)
  222.  
  223.     # check loan status and adjust buttons and history box
  224.     if item.has_key('loaned') and item['loaned'] == True:
  225.         self.widgets['popups']['loan'].set_sensitive(False)
  226.         self.widgets['popups']['email'].set_sensitive(True)
  227.         self.widgets['popups']['return'].set_sensitive(True)
  228.         self.widgets['menu']['loan'].set_sensitive(False)
  229.         self.widgets['menu']['email'].set_sensitive(True)
  230.         self.widgets['menu']['return'].set_sensitive(True)
  231.         w['loan_button'].set_sensitive(False)
  232.         w['email_reminder_button'].set_sensitive(True)
  233.         w['return_button'].set_sensitive(True)
  234.         
  235.         data_loan = get_loan_info(self.db, collection_id=item['collection_id'], volume_id=item['volume_id'], movie_id=item['movie_id'])
  236.         if data_loan is None:
  237.             item.loaned = False
  238.         else:
  239.             data_person = self.db.Person.get_by(person_id=data_loan.person.person_id)
  240.             self.person_name = str(data_person.name)
  241.             self.person_email = str(data_person.email)
  242.             self.loan_date = str(data_loan.date)
  243.             w['loan_info'].set_use_markup(False)
  244.             w['loan_info'].set_label(_("This movie has been loaned to ") + self.person_name + _(" on ") + self.loan_date[:10])
  245.     if item.has_key('loaned') and item['loaned'] != True: # "loaned" status can be changed above, so don't use "else:" in this line
  246.         self.widgets['popups']['loan'].set_sensitive(True)
  247.         self.widgets['popups']['email'].set_sensitive(False)
  248.         self.widgets['popups']['return'].set_sensitive(False)
  249.         self.widgets['menu']['loan'].set_sensitive(True)
  250.         self.widgets['menu']['email'].set_sensitive(False)
  251.         self.widgets['menu']['return'].set_sensitive(False)
  252.         w['return_button'].set_sensitive(False)
  253.         w['email_reminder_button'].set_sensitive(False)
  254.         w['loan_button'].set_sensitive(True)
  255.         w['loan_info'].set_markup("<b>%s</b>" % _("Movie not loaned"))
  256.  
  257.     # loan history    
  258.     self.loans_treemodel.clear()
  259.     if item.has_key('collection_id') or item.has_key('volume_id') or item.has_key('movie_id'):
  260.         loans = get_loan_history(self.db, collection_id=item['collection_id'], volume_id=item['volume_id'], movie_id=item['movie_id'])
  261.         for loan in loans:
  262.             myiter = self.loans_treemodel.append(None)
  263.             self.loans_treemodel.set_value(myiter, 0,'%s' % str(loan.date)[:10])
  264.             if loan.return_date and  loan.return_date != '':
  265.                 self.loans_treemodel.set_value(myiter, 1, str(loan.return_date)[:10])
  266.             else:
  267.                 self.loans_treemodel.set_value(myiter, 1, "---")
  268.             person = self.db.Person.get_by(person_id=loan.person.person_id)
  269.             self.loans_treemodel.set_value(myiter, 2, person.name)
  270.  
  271.     # volumes/collections
  272.     if item.has_key('volume_id') and item['volume_id']>0:
  273.         if item.has_key('volume') and item['volume']:
  274.             w['volume'].set_markup("<b>%s</b>" % gutils.html_encode(item['volume'].name))
  275.             w['show_volume_button'].set_sensitive(True)
  276.         else:
  277.             w['volume'].set_text('')
  278.             w['show_volume_button'].set_sensitive(False)
  279.     else:
  280.             w['volume'].set_text('')
  281.             w['show_volume_button'].set_sensitive(False)
  282.     if item.has_key('collection_id') and item['collection_id']>0:
  283.         if item.has_key('collection') and item['collection']:
  284.             w['collection'].set_markup("<b>%s</b>" % gutils.html_encode(item['collection'].name))
  285.             w['show_collection_button'].set_sensitive(True)
  286.         else:
  287.             w['collection'].set_text('')
  288.             w['show_collection_button'].set_sensitive(False)
  289.     else:
  290.         w['collection'].set_text('')
  291.         w['show_collection_button'].set_sensitive(False)
  292.  
  293.     # languages
  294.     for i in w['audio_vbox'].get_children():
  295.         i.destroy()
  296.     for i in w['subtitle_vbox'].get_children():
  297.         i.destroy()
  298.     if item.has_key('languages') and len(item['languages'])>0:
  299.         for i in item['languages']:
  300.             if i.type == 3: # subtitles
  301.                 if i.subformat:
  302.                     tmp = "%s - %s" % (i.language.name, i.subformat.name)
  303.                 else:
  304.                     tmp = "%s" % i.language.name
  305.                 w['subtitle_vbox'].pack_start(gtk.Label(tmp))
  306.             else:
  307.                 language = i.language.name
  308.                 if i.type is not None and len(self._lang_types[i.type])>0:
  309.                     language += " <i>%s</i>" % self._lang_types[i.type]
  310.                 tmp = ''
  311.                 if i.achannel:
  312.                     tmp = i.achannel.name
  313.                 if i.acodec:
  314.                     if len(tmp)>0:
  315.                         tmp += ", %s" % i.acodec.name
  316.                     else:
  317.                         tmp = i.acodec.name
  318.                 if len(tmp)>0:
  319.                     tmp = "%s (%s)" % (language, tmp)
  320.                 else:
  321.                     tmp = language
  322.                 widget = gtk.Label(tmp)
  323.                 widget.set_use_markup(True)
  324.                 w['audio_vbox'].pack_start(widget)
  325.     w['audio_vbox'].show_all()
  326.     w['subtitle_vbox'].show_all()
  327.     #tags
  328.     if item.has_key('tags'):
  329.         tmp = ''
  330.         for tag in item['tags']:
  331.             tmp += "%s, " % tag.name
  332.         tmp = tmp[:-2] # cut last comma
  333.         w['tags'].set_text(tmp)
  334.     #}}}
  335.     
  336. def populate(self, movies=None, where=None):#{{{
  337.     if self.initialized is False:
  338.         return False
  339.     from sqlalchemy import Select, desc
  340.     
  341.     if movies is None:
  342.         movies = Select([self.db.Movie.c.number,
  343.             self.db.Movie.c.o_title, self.db.Movie.c.title,
  344.             self.db.Movie.c.director, self.db.Movie.c.image,
  345.             self.db.Movie.c.genre, self.db.Movie.c.seen,
  346.             self.db.Movie.c.year, self.db.Movie.c.runtime,
  347.             self.db.Movie.c.rating])
  348.  
  349.     if isinstance(movies, Select):
  350.         if not where: # because of possible 'seen', 'loaned', 'collection_id' in where
  351.             # seen / loaned
  352.             loaned_only = self.widgets['menu']['loaned_movies'].get_active()
  353.             not_seen_only = self.widgets['menu']['not_seen_movies'].get_active()
  354.             if loaned_only:
  355.                 movies.append_whereclause(self.db.Movie.c.loaned==True)
  356.             if not_seen_only:
  357.                 movies.append_whereclause(self.db.Movie.c.seen==False)
  358.             # collection
  359.             pos = self.widgets['filter']['collection'].get_active()
  360.             if pos >= 0:
  361.                 col_id = self.collection_combo_ids[pos]
  362.                 if col_id > 0:
  363.                     movies.append_whereclause(self.db.Movie.c.collection_id==col_id)
  364.             # volume
  365.             pos = self.widgets['filter']['volume'].get_active()
  366.             if pos >= 0:
  367.                 vol_id = self.volume_combo_ids[pos]
  368.                 if vol_id > 0:
  369.                     movies.append_whereclause(self.db.Movie.c.volume_id==vol_id)
  370.             # loaned to
  371.             pos = self.widgets['filter']['loanedto'].get_active()
  372.             if pos >= 0:
  373.                 per_id = self.loanedto_combo_ids[pos]
  374.                 if per_id > 0:
  375.                     from sqlalchemy import join, exists, and_
  376.                     loan_exists = exists([self.db.Loan.c.movie_id], \
  377.                         and_(self.db.Movie.c.movie_id==self.db.Loan.c.movie_id, self.db.Loan.c.person_id==per_id, self.db.Loan.c.return_date==None))
  378.                     movies.append_whereclause(loan_exists)
  379.                     #loan_join = join(self.db.metadata.tables['movies'], \
  380.                     #    self.db.metadata.tables['loans'], \
  381.                     #    self.db.metadata.tables['movies'].c.movie_id==self.db.metadata.tables['loans'].c.movie_id)
  382.                     #movies = movies.select_from(loan_join)
  383.             # tag
  384.             pos = self.widgets['filter']['tag'].get_active()
  385.             if pos >= 0:
  386.                 tag_id = self.bytag_combo_ids[pos]
  387.                 if tag_id > 0:
  388.                     from sqlalchemy import join, exists, and_
  389.                     tag_exists = exists([self.db.MovieTag.c.movie_id], \
  390.                         and_(self.db.Movie.c.movie_id==self.db.MovieTag.c.movie_id, self.db.MovieTag.c.tag_id==tag_id))
  391.                     movies.append_whereclause(tag_exists)
  392.         
  393.         # select sort column
  394.         sort_column_name = self.config.get('sortby', 'number', section='mainlist')
  395.         sort_reverse = self.config.get('sortby_reverse', False, section='mainlist')
  396.         for i in sort_column_name.split(','):
  397.             if self.db.Movie.c.has_key(i):
  398.                 if sort_reverse:
  399.                     movies.order_by_clause.append(desc(self.db.Movie.c[i]))
  400.                 else:
  401.                     movies.order_by_clause.append(self.db.Movie.c[i])
  402.         
  403.         # additional whereclause (volume_id, collection_id, ...)
  404.         if where:
  405.             for i in where:
  406.                 if self.db.Movie.c.has_key(i):
  407.                     movies.append_whereclause(self.db.Movie.c[i]==where[i])
  408.         movies = movies.execute().fetchall()
  409.  
  410.     self.total = len(movies)
  411.     # disable refreshing while inserting
  412.     self.widgets['treeview'].freeze_child_notify()
  413.     self.widgets['treeview'].set_model(None)
  414.  
  415.     # save user sort column
  416.     sort_column_id, order = self.treemodel.get_sort_column_id()
  417.  
  418.     # new treemodel (faster and prevents some problems)
  419.     self.treemodel = gtk.TreeStore(str, gtk.gdk.Pixbuf, str, str, str, str, bool, str, str, int)
  420.  
  421.     # check preferences to hide or show columns
  422.     if self.config.get('number', True, 'mainlist') == True:
  423.         self.number_column.set_visible(True)
  424.     else:
  425.         self.number_column.set_visible(False)
  426.     if self.config.get('otitle', True, 'mainlist') == True:
  427.         self.otitle_column.set_visible(True)
  428.     else:
  429.         self.otitle_column.set_visible(False)
  430.     if self.config.get('title', True, 'mainlist') == True:
  431.         self.title_column.set_visible(True)
  432.     else:
  433.         self.title_column.set_visible(False)
  434.     if self.config.get('director', True, 'mainlist') == True:
  435.         self.director_column.set_visible(True)
  436.     else:
  437.         self.director_column.set_visible(False)
  438.     if self.config.get('image', True, 'mainlist') == True:
  439.         self.image_column.set_visible(True)
  440.     else:
  441.         self.image_column.set_visible(False)
  442.     if self.config.get('genre', True, 'mainlist') == True:
  443.         self.genre_column.set_visible(True)
  444.     else:
  445.         self.genre_column.set_visible(False)
  446.     if self.config.get('seen', True, 'mainlist') == True:
  447.         self.seen_column.set_visible(True)
  448.     else:
  449.         self.seen_column.set_visible(False)
  450.     if self.config.get('year', True, 'mainlist') == True:
  451.         self.year_column.set_visible(True)
  452.     else:
  453.         self.year_column.set_visible(False)
  454.     if self.config.get('runtime', True, 'mainlist') == True:
  455.         self.runtime_column.set_visible(True)
  456.     else:
  457.         self.runtime_column.set_visible(False)
  458.     if self.config.get('rating', True, 'mainlist') == True:
  459.         self.rating_column.set_visible(True)
  460.     else:
  461.         self.rating_column.set_visible(False)
  462.         
  463.     for movie in movies:
  464.         myiter = self.treemodel.append(None)
  465.         
  466.         self.treemodel.set_value(myiter,0,'%004d' % int(movie.number))
  467.  
  468.         if self.config.get('image', True, section='mainlist') == True:
  469.             tmp_dest = self.locations['posters']
  470.             tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))
  471.             if movie.image and os.path.isfile(tmp_img):
  472.                 image_path = tmp_img
  473.             else:
  474.                 image_path = os.path.join(self.locations['images'], 'default_thumbnail.png')
  475.             # lets see if we have a scaled down thumbnail already created
  476.             if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))):
  477.                 pass
  478.             else:
  479.                 # if not, lets make one for future use :D
  480.                 original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image)
  481.                 if os.path.isfile(original_image):
  482.                     gutils.make_thumbnail(self, "%s.jpg" % movie.image)
  483.                 else:
  484.                     self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images'])
  485.                     pixbuf = self.Image.get_pixbuf()
  486.             self.Image.set_from_file(image_path)
  487.             pixbuf = self.Image.get_pixbuf()
  488.             self.treemodel.set_value(myiter, 1, pixbuf)
  489.         self.treemodel.set_value(myiter,2,movie.o_title)
  490.         self.treemodel.set_value(myiter,3,movie.title)
  491.         self.treemodel.set_value(myiter,4,movie.director)
  492.         self.treemodel.set_value(myiter,5,movie.genre)
  493.         self.treemodel.set_value(myiter,6,movie.seen)
  494.         if movie.year is not None and isinstance(movie.year, int):
  495.             self.treemodel.set_value(myiter,7,movie.year)
  496.         if movie.runtime is not None and isinstance(movie.runtime, int):
  497.             self.treemodel.set_value(myiter,8, '%003d' % movie.runtime + _(' min'))
  498.         if movie.rating is not None and isinstance(movie.rating, int):
  499.             self.treemodel.set_value(myiter,9,movie.rating)
  500.         
  501.     # restore user sort column
  502.     if sort_column_id is not None:
  503.         self.treemodel.set_sort_column_id(sort_column_id, gtk.SORT_ASCENDING)
  504.     
  505.     # add new treemodel and allow refreshs again
  506.     self.widgets['treeview'].set_model(self.treemodel)
  507.     self.widgets['treeview'].thaw_child_notify()
  508.     self.widgets['treeview'].set_cursor_on_cell(0)
  509.     self.count_statusbar()
  510. #}}}
  511.  
  512. # vim: fdm=marker
  513.